package com.ycz.algorithm.utils.hash;

import java.util.ArrayList;
import java.util.List;

/**
 * @author yancz
 * @ClassName ArrayHashMap
 * @description: 哈希表的数组实现
 * @date 2024-12-03 16:19:05
 * @version: 1.0
 */
public class ArrayHashMap {

    private List<Pair> buckets;

    // 初始化哈希表，包含100个桶，100实际上是哈希表的容量，可通过扩大容量来减少哈希冲突
    public ArrayHashMap() {
        buckets = new ArrayList<>();
        for (int i = 0; i < 100; i++) {
            buckets.add(null);
        }
    }

    // 自定义哈希函数
    private int hashFunction(int key) {
        int index = key % 100;
        return index;
    }

    // 查询操作
    public String get(int key) {
        int index = hashFunction(key); // 先计算哈希值
        Pair pair = buckets.get(index); // 根据哈希值获取桶
        if (pair == null) return null;
        return pair.val; // 获取桶中的value
    }

    // 添加操作
    public void put(int key, String val) {
        Pair pair = new Pair(key, val);
        int index = hashFunction(key); // 计算哈希值，哈希值重复，会发生覆盖
        buckets.set(index, pair);
    }

    // 删除操作
    public void remove(int key) {
        int index = hashFunction(key);
        buckets.set(index, null); // 元素置为null，相当于删除
    }

    // 获取键值对
    public List<Pair> pairSet() {
        List<Pair> pairSet = new ArrayList<>();
        for (Pair pair : buckets) {
            if (pair != null) pairSet.add(pair);
        }
        return pairSet;
    }

    // 获取所有key
    public List<Integer> keySet() {
        List<Integer> keyList = new ArrayList<>();
        for (Pair pair : buckets) {
            if (pair != null) keyList.add(pair.key);
        }
        return keyList;
    }

    // 获取所有value
    public List<String> valueSet() {
        List<String> valueList = new ArrayList<>();
        for (Pair pair : buckets) {
            if (pair != null) valueList.add(pair.val);
        }
        return valueList;
    }

    // 打印
    public void print() {
        for (Pair kv : pairSet()) {
            System.out.println(kv.key + "===>" + kv.val);
        }
    }

    public static void main(String[] args) {
        ArrayHashMap arrayHashMap = new ArrayHashMap();
        // 添加操作
        arrayHashMap.put(1, "a");
        arrayHashMap.put(2, "b");
        arrayHashMap.put(3, "c");
        arrayHashMap.put(4, "d");
        arrayHashMap.put(5, "e");
        arrayHashMap.print();
        // 获取元素
        System.out.println("key为4对应的值为：" + arrayHashMap.get(4));
        // 删除操作
        arrayHashMap.remove(4);
        arrayHashMap.print();
        // 获取所有key
        List<Integer> keys = arrayHashMap.keySet();
        System.out.println("所有key如下：");
        for (int i : keys) {
            System.out.print(i + "\t");
        }
        System.out.println();
        System.out.println("所有value如下：");
        List<String> values = arrayHashMap.valueSet();
        for (String s : values) {
            System.out.print(s + "\t");
        }
    }

}
